package com.ruoyi.charge.clinet;

import cn.hutool.core.util.HexUtil;
import com.ruoyi.charge.model.DataMessage;
import com.ruoyi.charge.utils.YunCrcUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;

/**
 * 数据帧解码
 */
public class FrameCodec {
    private static final Logger logger = LoggerFactory.getLogger(FrameCodec.class);

    private FrameCodec() {
        // 私有构造函数，防止实例化
    }


    public static DataMessage decodeFrame(byte[] data) {
        //起始标志 数据长度 序列号域 加密标志 帧类型标志 消息体 帧校验域
        //1 字节  1 字节   2 字节  1 字节   1 字节   N 字节 2 字节
        // 实现解码逻辑，解析接收到的数据帧
//        logger.info("解码接收到的数据: {}", HexUtil.encodeHexStr(data));
        try {
            String hexStr = HexUtil.encodeHexStr(data);

            DataMessage message = DataMessage.builder()
                    .length(Integer.parseInt(hexStr.substring(2, 4), 16))
                    .serial(Short.parseShort(hexStr.substring(4, 8), 16))
                    .encrypt(Byte.parseByte(hexStr.substring(8, 10), 16))
                    .type(Byte.parseByte(hexStr.substring(10, 12), 16))
                    .payload(HexUtil.decodeHex(hexStr.substring(12, hexStr.length() - 4)))
                    .build();
            // 获取原来的crc
            String cryOrigin = hexStr.substring(hexStr.length() - 4);
            byte[] forCrcData = Arrays.copyOfRange(data, 2, data.length - 2);
            // 最后2字节
            String crc = HexUtil.encodeHexStr(YunCrcUtil.calculateCrc(forCrcData));
            if (!crc.equals(cryOrigin)) {
                logger.error("CRC校验失败: 获取={}, 计算={}", crc, cryOrigin);
                return null;
            }
            message.setCrc(crc);
            return message;
        } catch (Exception e) {
            logger.error("数据帧解码异常: {}", e.getMessage());
        }
        throw new RuntimeException("数据帧解码异常");
    }
}